﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using DevExpress.XtraEditors;
using Control;
using DevExpress.XtraGrid.Views.Grid;
using DevExpress.XtraGrid.Columns;
using LPV_POS.Module;
using DevExpress.XtraGrid.Views.Base;
using DevExpress.XtraEditors.Repository;

namespace LPV_POS.mh_pos
{
    public partial class frmDM_THE_NHOM : DevExpress.XtraEditors.XtraForm
    {
        #region 1.Biến toàn cục

        thuvien tv;//chứa các xử lý về CSDL
        string[] s;//mảng chuỗi chứa các parametter của procedure
        object[] o;//Mảng đối tượng chứa các giá trị tương ứng các para của store
        DODM_THE_NHOM T;//Đối tượng DM_THE_NHOM chứa các field của bảng
        DADM_THE_NHOM DA;//Chứa các xử lý đối tượng DM_THE_NHOM
        private bool FlagSua = false;//true:sua ; false :them moi
        private int OBJID = 0;//Biến khóa chính của bảng DM_THE_NHOM
        #endregion

        public frmDM_THE_NHOM()
        {
            DA = new DADM_THE_NHOM();
            T = DA.SetData_KhoHang(-1);
            tv = new thuvien();
            InitializeComponent();
            EventButton();
            InitControl();
            InitGrid();
            LoadDataGrid();
            //Xử lý 2
            InitGrid_The();
            LoadGrid_The();

            InitGrid_TheNhom();
            Event_Control2();
            
        }

        #region 2.Khởi tạo GridControl của DM_THE_NHOM

        private void InitGrid()
        {
            Col_TenNhom.FieldName = "OBJNAME";
            Col_tenhanghoa.FieldName = "SO_THE";
            CotCal(Col_SoLuong, "TONG_TIEN_KM");
            CotCal(Col_GiamGia,"GIAM_GIA");
            Col_GhiChu.FieldName = "GHI_CHU";
            GridView_Data.FocusedRowChanged+=new FocusedRowChangedEventHandler(GridView_Data_FocusedRowChanged);
        }

        private void LoadDataGrid()
        {
            DataSet ds = DA.GetData_KhoHang();
            GridControl_Data.DataSource = ds.Tables[0].DefaultView;
        }

        #endregion

        #region 3.Khởi tạo Control

        private void InitControl()
        {
            EnableControl(true);
        }//Khởi tạo các Control trên Form

        private void EnableControl(bool at)
        {
            txtTenBan.Properties.ReadOnly = at;
            SoThe.Properties.ReadOnly = at;
            TongTien.Properties.ReadOnly = at;
            GiamGia.Properties.ReadOnly = at;
            MemoGhiChu.Properties.ReadOnly = at;
        }//đóng mở các control khi thêm,lưu,sửa

        private void ClearControl()//Xóa các control khi thêm mới dữ liệu nhóm thẻ
        {
            txtTenBan.Text = "";
            SoThe.Value = 0;
            TongTien.Value = 0;
            GiamGia.Value = 0;
        }

        #endregion

        #region 4.Xử lý Nút

        private void EventButton()
        {
            btnThem.Click += new EventHandler(btnThem_Click);
            BtnXoa.Click += new EventHandler(BtnXoa_Click);
            BtnSua.Click += new EventHandler(BtnSua_Click);
            BtnLuu.Click += new EventHandler(BtnLuu_Click);
            BtnThoat.Click += new EventHandler(BtnThoat_Click);
            BtnGhiChu.Click += new EventHandler(BtnGhiChu_Click);
        }

        void BtnGhiChu_Click(object sender, EventArgs e)
        {
            MemoGhiChu.Text = new cpublic().loadformchu_point(300, 200);
        }

        void BtnThoat_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        void BtnLuu_Click(object sender, EventArgs e)
        {
            if (FlagSua == true)//truong hop sua data
            {
                if (GetData() == true)
                {
                    if (DA.Update_DanhMuc(T) == 1)
                    {
                        //Successful
                        MessageBox_LPV.Show("Lưu dữ liệu thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        EnableControl(true);
                        FlagSua = false;
                        LoadDataGrid();
                    }
                    else
                    {
                        //UnSuccessful
                        MessageBox_LPV.Show("Lưu dữ liệu không thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
            }
            else //truong hop them moi
            {
                if (GetData() == true)
                {
                    if (DA.Insert_DanhMuc(T) == 1)
                    {
                        //Successful
                        MessageBox_LPV.Show("Lưu dữ liệu thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        EnableControl(true);
                        LoadDataGrid();
                    }
                    else
                    {
                        //UnSuccessful
                        MessageBox_LPV.Show("Lưu dữ liệu không thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
            }
        }

        void BtnSua_Click(object sender, EventArgs e)
        {
            DataRow row=GridView_Data.GetDataRow(GridView_Data.FocusedRowHandle);
            if(row!=null)
            {
                if (row["OBJID"].ToString() + "" != "")
                {
                    T.OBJID = Convert.ToInt32(row["OBJID"]);
                    EnableControl(false);
                }
                else
                    return;
            }
            FlagSua = true;
            //EnableControl(false);
            
        }

        void BtnXoa_Click(object sender, EventArgs e)
        {
            if (MessageBox_LPV.Show("Bạn muốn xóa dữ liệu này?", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.OK)
            { 
               
                //Xoa Data
                DataRow row = GridView_Data.GetDataRow(GridView_Data.FocusedRowHandle);
                if (row != null)
                {
                    if (row["OBJID"].ToString() + "" != "")
                    {
                         //Kiểm tra nhóm thẻ này đã tạo các thẻ con chưa
                        DataSet ds=tv.sql_SelectDataset("DM_THE","DM_NHOMTHE_MA",Convert.ToInt32(row["OBJID"]));
                        if (ds == null)
                        {
                            return;
                        }
                        if(ds.Tables[0].Rows.Count>0)
                        {
                            MessageBox_LPV.Show("Nhóm thẻ này không được xóa vì đã được sử dụng.", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                            return;
                        }

                        if (DA.Delete_DanhMuc(Convert.ToInt32(row["OBJID"]))>=0)
                        {
                            LoadDataGrid();
                            MessageBox_LPV.Show("Xóa dữ liệu thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        }       
                        else
                        {
                            MessageBox_LPV.Show("Xóa dữ liệu không thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                    }
                }
                
            }
        }

        void btnThem_Click(object sender, EventArgs e)
        {
            EnableControl(false);
            ClearControl();
            txtTenBan.Focus();
            FlagSua = false;
            T.OBJID = 0;
        }

        #endregion

        #region 5.Xử lý Sự kiện

        private void GridView_Data_FocusedRowChanged(object sender, FocusedRowChangedEventArgs e)
        {
            try
            {
                //Get ID trên lưới
                DataRow row = GridView_Data.GetDataRow(GridView_Data.FocusedRowHandle);
                if (row != null)
                {
                    txtTenBan.Text = row["OBJNAME"].ToString();
                    SoThe.Value = Convert.ToDecimal(row["SO_THE"]);
                    TongTien.Value = Convert.ToDecimal(row["TONG_TIEN_KM"]);
                    GiamGia.Value = Convert.ToDecimal(row["GIAM_GIA"]);
                    MemoGhiChu.Text = row["GHI_CHU"].ToString();
                    LoadGrid_TheNhom(Convert.ToInt32(row["OBJID"]));
                }
            }
            catch (Exception)
            {
            }
        }

        #endregion

        #region 6.Khởi tạo dữ liệu để xử lý

        //Gán dữ liệu cần thêm sửa vào đối tượng và kiểm tra dữ liệu của đối tượng
        private bool GetData()
        {
            //1.Kiểm tra dữ liệu nhập
            if (txtTenBan.Text == "")
            {
                MessageBox_LPV.Show("Mời nhập tên nhóm thẻ", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return false;
            }
            //
            //2.Gán dữ liệu vào DO
            T.OBJNAME = txtTenBan.Text;
            T.SO_THE = Convert.ToInt32(SoThe.Value);
            T.TONG_TIEN_KM = Convert.ToSingle(TongTien.Value);
            T.GIAM_GIA = Convert.ToSingle(GiamGia.Value);
            T.GHI_CHU = MemoGhiChu.Text;
            //
            return true;
        }

        #endregion

        #region 7.Xử lý Database

        #endregion

        #region 8.Hỗ trợ

        //Tạo cột Calculate trên Grid
        private void CotCal(GridColumn Column, string FieldName)
        {
            RepositoryItemCalcEdit Cal = new RepositoryItemCalcEdit();
            ((System.ComponentModel.ISupportInitialize)(Cal)).BeginInit();

            Cal.Buttons.AddRange(new DevExpress.XtraEditors.Controls.EditorButton[] {
            new DevExpress.XtraEditors.Controls.EditorButton(DevExpress.XtraEditors.Controls.ButtonPredefines.Combo)});

            Column.ColumnEdit = Cal;
            Column.FieldName = FieldName;
            Cal.Name = "Cal";
            Cal.DisplayFormat.FormatString = "N0";
            Cal.DisplayFormat.FormatType = DevExpress.Utils.FormatType.Numeric;
            ((System.ComponentModel.ISupportInitialize)(Cal)).EndInit();
        }

        #endregion

        #region Xử lý phần cập nhật nhóm thẻ vào từng thẻ

        //Khởi tạo lưới danh sách thẻ
        private void InitGrid_The()
        {
            Col_MaThe.FieldName = "CODE";
            Col_TenKhachHang.FieldName = "TEN_KH";
        }

        //Load dữ liệu danh sách các thẻ chưa phân nhóm
        private void LoadGrid_The()
        {
            string sql = @"SELECT dt.CODE,dt.DM_KHACHHANG_MA,dk.OBJNAME AS TEN_KH
                            FROM DM_THE dt
                            left JOIN DM_KHACHHANG dk ON dt.DM_KHACHHANG_MA=dk.OBJID
                            WHERE ISNULL(dt.DM_NHOMTHE_MA,0) = 0";
            DataTable dt = tv.SP_SelectDataTable("SP_EXECUTESQL", new string[] { "@sSQL" }, new object[] { sql });
            try
            {
                if (dt != null)
                {
                    GridControl_The.DataSource = dt;
                }
            }
            catch (Exception)
            {
            }
        }

        //Khởi tạo lưới nhóm thẻ
        private void InitGrid_TheNhom()
        {
            Col2_MaThe.FieldName = "CODE";
            Col2_TenNhomThe.FieldName = "DM_NHOMTHE_TEN";
            Col2_KhachHang.FieldName = "TEN_KH";
        }

        //Load dữ liệu danh sách các thẻ đã phân nhóm từ nhóm thẻ chọn
        private void LoadGrid_TheNhom(int NhomThe)
        {
            string sql = @"SELECT dt.CODE,dt.DM_KHACHHANG_MA,dk.OBJNAME AS TEN_KH,dt.DM_NHOMTHE_MA,dt.DM_NHOMTHE_TEN
                            FROM DM_THE dt
                            left JOIN DM_KHACHHANG dk ON dt.DM_KHACHHANG_MA=dk.OBJID
                            WHERE ISNULL(dt.DM_NHOMTHE_MA,0) ="+NhomThe;
            DataTable dt = tv.SP_SelectDataTable("SP_EXECUTESQL", new string[] { "@sSQL" }, new object[] { sql });
            try
            {
                if (dt != null)
                {
                    GridControl_TheNhom.DataSource = dt;
                }
            }
            catch (Exception)
            {
            }
        }

        //sự kiện của Button
        private void Event_Control2()
        {
            BtnNext.Click += new EventHandler(BtnNext_Click);
            BtnPre.Click += new EventHandler(BtnPre_Click);
        }

        //Xóa các thẻ đã phân nhóm
        void BtnPre_Click(object sender, EventArgs e)
        {
            //Xóa nhóm thẻ
            //Lấy dòng dữ liệu của nhóm thẻ đang chọn
            DataRow r = gridView_TheNhom.GetDataRow(gridView_TheNhom.FocusedRowHandle);
            if (r != null)
            {
                if (r == null)
                {
                    return;
                }
                if (r["CODE"].ToString() + "" == "")
                {
                    return;
                }
                string SO_THE = r["CODE"].ToString();//số thẻ cần update
                string sql = @"UPDATE DM_THE SET DM_NHOMTHE_MA =NULL,DM_NHOMTHE_TEN=NULL where CODE='" + SO_THE + "'";
                int i = tv.SP_Update("SP_EXECUTESQL", new string[] { "@sSQL" }, new object[] { sql });
                if (i >= 0)//Cập nhật vào nhóm thẻ thành công => load lại dữ liệu
                {
                    DataRow dr = GridView_Data.GetDataRow(GridView_Data.FocusedRowHandle);
                    if (dr != null)
                    {
                        int ID_NHOMTHE = -1;
                        if (dr["OBJID"].ToString() + "" == "")
                            return;
                        ID_NHOMTHE = Convert.ToInt32(dr["OBJID"]);
                        LoadGrid_TheNhom(ID_NHOMTHE);
                    }
                    LoadGrid_The();
                    gridView_TheNhom.FocusedRowHandle = gridView_TheNhom.RowCount;
                }
            }
        }

        //chuyển các thẻ chưa phân nhóm vào nhóm thẻ
        void BtnNext_Click(object sender, EventArgs e)
        {
            //Update lại thẻ
            //dr : lấy ra dữ liệu nhóm thẻ
            DataRow dr = GridView_Data.GetDataRow(GridView_Data.FocusedRowHandle);
            if (dr != null)
            {
                string SO_THE = "";
                int ID_NHOMTHE = -1;
                string TEN_NHOMTHE = "";
                if (dr["OBJID"].ToString() + "" == "")
                    return;
                ID_NHOMTHE = Convert.ToInt32(dr["OBJID"]);
                TEN_NHOMTHE = dr["OBJNAME"].ToString() + "";

                DataRow r = GridView_The.GetDataRow(GridView_The.FocusedRowHandle);
                if (r == null)
                {
                    return;
                }
                if (r["CODE"].ToString() + "" == "")
                {
                     return;
                }
                SO_THE = r["CODE"].ToString();
                

                string sql = @"UPDATE DM_THE SET DM_NHOMTHE_MA =" + ID_NHOMTHE + ",DM_NHOMTHE_TEN='" + TEN_NHOMTHE + "' where CODE='" + SO_THE + "'";
                int i = tv.SP_Update("SP_EXECUTESQL", new string[] { "@sSQL" }, new object[] { sql });
                if (i >= 0)
                {
                    LoadGrid_TheNhom(ID_NHOMTHE);
                    LoadGrid_The();
                    gridView_TheNhom.FocusedRowHandle = gridView_TheNhom.RowCount;
                }

            }
        }


        #endregion

    }

    public class DODM_THE_NHOM
    {
        public int OBJID;
        public string OBJNAME;
        public int SO_THE;
        public float TONG_TIEN_KM;
        public float GIAM_GIA;
        public string GHI_CHU;
        public DODM_THE_NHOM() { }
    }

    public class DADM_THE_NHOM
    {
        thuvien tv;
        public DADM_THE_NHOM()
        {
            tv = new thuvien();
        }

        public int Insert_DanhMuc(DODM_THE_NHOM T)
        {
            return Execute_Query(T, 1);
        }

        public int Update_DanhMuc(DODM_THE_NHOM T)
        {
            return Execute_Query(T, 2);
        }

        public int Delete_DanhMuc(int IDKey)
        {
            string sql = "delete from DM_THE_NHOM where OBJID=" + IDKey;
            return tv.SP_Update("SP_EXECUTESQL", new string[] { "@sSQL" }, new object[] { sql });
            //return tv.ExcuteQuery(sql);
        }

        #region 1.Thực thi store procedure

        /// <summary>
        /// Thực thi câu store
        /// </summary>
        /// <param name="T">Đối tượng Kho</param>
        /// <param name="choice">1:Thêm mới ; 2:Cập nhật</param>
        /// <returns></returns>
        public int Execute_Query(DODM_THE_NHOM T, int choice)
        {
            string[] s;
            object[] o;
            s = new string[] { "@flag", "@OBJID", "@OBJNAME", "@SO_THE", "@TONG_TIEN_KM", "@GIAM_GIA","@GHI_CHU"};
            o = new object[] { choice, T.OBJID, T.OBJNAME, T.SO_THE, T.TONG_TIEN_KM, T.GIAM_GIA,T.GHI_CHU};
            int ketqua = tv.SP_Update("sp_DM_THE_NHOM", s, o);
            return ketqua;
        }

        #endregion

        #region 2.Set + Get Data

        public DODM_THE_NHOM SetData_KhoHang(int IDKey)
        {
            DODM_THE_NHOM T = new DODM_THE_NHOM();
            DataSet ds = tv.sql_SelectDataset("DM_THE_NHOM", "OBJID", IDKey);
            if (ds != null)
            {
                foreach (DataRow dr in ds.Tables[0].Rows)
                {
                    T.OBJID = Convert.ToInt32(dr[0]);
                    T.OBJNAME = dr[1].ToString();
                    T.SO_THE = Convert.ToInt32(dr[2]);
                    T.TONG_TIEN_KM = Convert.ToSingle(dr[3]);
                    T.GIAM_GIA = Convert.ToSingle(dr[4]);
                    T.GHI_CHU = dr[5].ToString();
                }
            }
            return T;
        }

        public DataSet GetData_KhoHang()
        {
            string[] s;
            object[] o;
            s = new string[] { "@flag", "@OBJID", "@OBJNAME", "@SO_THE", "@TONG_TIEN_KM", "@GIAM_GIA","@GHI_CHU"};
            o = new object[] { 4, 0, "", 0, 0, 0,""};
            return tv.SP_SelectDataset("sp_DM_THE_NHOM", s, o);
        }

        #endregion

    }

}